<?php
/**************************************************采集内核***************************************************/
/**
 * 采集远程数据
 * @version 1.1.0 首次引入
 * @param string $useragent 必需;模拟用户HEAD头,可选值有（auto|windows|linux|ios|iphone）;默认：auto
 * @param int $timeout 必需;超时时间;默认：10
 * @param string $url 必需;待抓取的远程地址;默认：空
 * @param array $post_data 可选;post请求时发送的数据，留空则为get请求;默认：空
 * @param string $referer 可选;模拟来湃URL地址;默认：空
 * @param array $headers 可选;自定义请求头;默认：空
 * @param string $cookie 可选;模拟cookie信息;默认：空
 * @param string $proxy 可选;代理请求信息;默认：空
 * @return string $string 返回读取远程网页的内容
 */
function DcCurl($useragent='auto', $timeout=10, $url, $post_data='', $referer='', $headers=[], $cookie='', $proxy=''){
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_HEADER, 0);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt ($ch, CURLOPT_TIMEOUT, $timeout);
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);//301 302
    curl_setopt ($ch, CURLOPT_ENCODING, "");//乱码是因为返回的数据被压缩过了，在curl中加上一项参数即可
    //useragent
    if($useragent == 'windows'){
        curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50');
    }elseif($useragent == 'linux'){
        curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:20.0) Gecko/20100101 Firefox/20.0');
    }elseif($useragent == 'ios'){
        curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh;U;IntelMacOSX10_6_8;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50');
    }elseif($useragent == 'iphone'){
        curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X; zh-CN) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/14F89 UCBrowser/10.9.17.807 Mobile');
    }elseif($useragent == 'android'){
        curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Linux; U; Android 7.1.1; zh-cn; OPPO R11st Build/NMF26X) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.134 Mobile Safari/537.36 OppoBrowser/4.6.5.3');
    }    
    //是否post
    if(is_array($post_data)){
        curl_setopt($ch, CURLOPT_POST, 1);// post数据
        if($headers[0] == 'Content-Type: application/json'){
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));    // post的变量
        }else{
            curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);    // post的变量
        }
    }
    //是否伪造来路
    if($referer){
        curl_setopt ($ch, CURLOPT_REFERER, $referer);
    }
    //是否headers
    if(is_array($headers)){
        //$headers = array('X-FORWARDED-FOR:28.58.88.10','CLIENT-IP:225.28.58.32');//构造IP
        curl_setopt ($ch, CURLOPT_HTTPHEADER, $headers);
    }    
    //是否cookie
    if($cookie){
        curl_setopt ($ch, CURLOPT_COOKIE, $cookie);
    }
    //IP代理
    if($proxy){
        curl_setopt ($ch, CURLOPT_PROXY, $proxy);
        //curl_setopt ($ch, CURLOPT_PROXYPORT, "80");
        //curl_setopt ($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC); //代理认证模式
        //curl_setopt ($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); //使用http代理模式
        //curl_setopt ($ch, CURLOPT_PROXYUSERPWD,'testuser:pass');
    }    
    //https自动处理
    $http = parse_url($url);
    if($http['scheme'] == 'https'){
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    }
    $content = curl_exec($ch);
    curl_close($ch);
    //
    if($content){
        return $content;
    }
    return false;
}
/**
 * 根据正则规则快捷提取内容
 * @version 1.0.0 首次引入
 * @param string $rule 必需;正则规则
 * @param string $html 必需;待提取的字符串
 * @return string $string 匹配后的字符串
 */
function DcPregMatch($rule,$html){
    $arr = explode('$$$',$rule);
    if(count($arr) == 2){
      preg_match('/'.$arr[1].'/', $html, $data);
        return $data[$arr[0]].'';
    }else{
      preg_match('/'.$rule.'/', $html, $data);
        return $data[1].'';
    }
}

/**************************************************字符串、Array、Xml、Json、Serialize***************************************************/
/**
 * 字符串DES加密
 * @version 1.6.0 首次引入
 * @param string $str 必需;待加密的字符串
 * @param string $secert 必需;加密密钥
 * @return string $string 过滤后的字符串
*/
function DcDesEncode($str, $secert='daicuo'){
    return openssl_encrypt($str, 'DES-ECB', trim($secert), 0);
}
/**
 * 字符串DESDES解密
 * @version 1.6.0 首次引入
 * @param string $str 必需;待解密的字符串
 * @param string $secert 必需;加密密钥
 * @return string $string 解密后的字符串
 */
function DcDesDecode($str, $secert='daicuo'){
    return openssl_decrypt($str, 'DES-ECB', trim($secert), 0);
}
/**
 * 字符串安全输出去除xss漏洞
 * @version 1.6.0 首次引入
 * @param string $string 必需;待过滤的字符串
 * @return string $string 过滤后的字符串
 */
function DcRemoveXss($string){
    return remove_xss($string);
}
/**
 * 字符串安全输出过滤目录名称不让跳转到上级目录
 * @version 1.6.0 优化过滤..与.
 * @version 1.5.0 首次引入
 * @param string $string 必需;待过滤的字符串
 * @return string $string 过滤后的字符串
 */
function DcDirPath($string){
    //if(!preg_match(“/^\w+$/”,$string)) exit(‘err!!!');//[A-Za-z0-9_]
    return str_replace(['..','.'], '', trim($string));
}
/**
 * 字符串安全输出去除Html标签
 * @version 1.5.0 首次引入
 * @param string $string 必需;待过滤的字符串
 * @param string $allow 可选;需保留的标签;默认：<p>
 * @return string $string 过滤后的字符串
 */
function DcStrip($string, $allow='<p>'){
    $string = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $string);
    $string = strip_tags(htmlspecialchars_decode(trim($string)), $allow);
    return stripslashes($string);
}
/**
 * 字符串安全输出转义HTML实体
 * @version 1.1.0 首次引入
 * @param string $string 必需;待过滤的字符串
 * @return string $string 过滤后的字符串
 */
function DcHtml($string){
    return htmlspecialchars(trim($string), ENT_QUOTES);
}
/**
 * %分隔的错误输出
 * @version 1.4.0 首次引入
 * @param string $value 必需;待分割的字符串
 * @return string $string 截取后的字符串
 */
function DcError($value){
    $value_array = explode('%', $value);
    if(count($value_array) > 1){
        return $value_array[1];
    }
    return $value;
}
/**
 * BOOL快捷输出
 * @version 1.3.0 首次引入
 * @param string $value 必需;待验证的字符串
 * @param bool $default 可选;验证规则;默认：true
 * @return string $string true|false
 */
function DcBool($value, $default=true){
    $array = ['1', 'true', 'on', 'yes'];
    if(in_array(strtolower($value), $array)){
        return $default;
    }
    return false;
}
/**
 * OnOff快捷输出
 * @version 1.3.0 首次引入
 * @param string $value 必需;待验证的字符串
 * @return string $string on|off
 */
function DcSwitch($value){
    if( DcBool($value) ){
        return 'on';
    }
    return 'off';
}
/**
 * 检测变量是否定义并默认输出
 * @version 1.6.0 首次引入
 * @param string $value 必需;待验证的字符串
 * @param mixed $default 必需;默认值;默认：空
 * @return string $string 验证后的字符串
 */
function DcIsset($value, $default=''){
    return isset($value) ? $value : $default;
}
/**
 * 字符串作比较是否相同后输出不同值
 * @version 1.1.0 首次引入
 * @param string $value 必需;待验证的字符串
 * @param string $default 必需;待比较的字符串;默认：空
 * @param string $stringTrue 必需;比较结果为真时输出的字符;默认：active
 * @param string $empty 必需;比较结果为假时输出的字符;默认：空
 * @return string $string 验证后的字符串
 */
function DcDefault($value, $default, $stringTrue='active', $stringFalse=''){
  if($value == $default){
    return $stringTrue;
  }
  return $stringFalse;
}
/**
 * 字符串空值快捷输出
 * @version 1.1.0 首次引入
 * @param string $value 必需;待验证的字符串
 * @param mixed $default 必需;默认值;默认：空
 * @return string $string 验证后的字符串
 */
function DcEmpty($value, $default=''){
    return !empty($value) ? $value : $default;
}
/**
 * 字符串截取
 * @version 1.0.0 首次引入
 * @param string $str 必需;待截取的字符串
 * @param int $start 必需;起始位置;默认：0
 * @param int $length 必需;截取长度;默认：空
 * @param bool $suffix 可选;超出长度是否以...显示;默认：true
 * @param string $charset 可选;字符编码;默认：utf-8
 * @return string $string 截取后的字符串
 */
function DcSubstr($str, $start=0, $length, $suffix=true, $charset="UTF-8"){
    $str = trim($str);
    if( function_exists('mb_strimwidth') ){
        if($suffix){
            return mb_strimwidth($str, $start, $length*2, '...', $charset);
        }
        return mb_strimwidth($str, $start, $length*2, '', $charset);
    }
    return @substr($str, $start, $length);
}
/**
 * XML转数组
 * @version 1.5.0 首次引入
 * @param string $xml 必需;待验证的字符串
 * @param bool $isnormal 可选;是否转义;默认：false
 * @return array $array 转换后的数组
 */
function DcXmlUnSerialize(&$xml, $isnormal = false) {
    $xml = new \net\Xml($isnormal);
    $data = $xml->parse($xml);
    return $data;
}
/**
 * 数组转XML
 * @version 1.5.0 首次引入
 * @param array $xml 必需;待转换的数组
 * @param bool $htmlon 可选;是否支持HTML标签;默认：false
 * @param bool $isnormal 可选;是否转义;默认：false
 * @param int $level 可选;待验证的字符串;默认：1
 * @return string $string 转换后的XML代码
 */
function DcXmlSerialize($arr, $htmlon = false, $isnormal = false, $level = 1) {
    $s = $level == 1 ? "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\r\n<root>\r\n" : '';
    $space = str_repeat("\t", $level);
    foreach($arr as $k => $v) {
        if(!is_array($v)) {
            $s .= $space."<item id=\"$k\">".($htmlon ? '<![CDATA[' : '').$v.($htmlon ? ']]>' : '')."</item>\r\n";
        } else {
            $s .= $space."<item id=\"$k\">\r\n".DcXmlSerialize($v, $htmlon, $isnormal, $level + 1).$space."</item>\r\n";
        }
    }
    $s = preg_replace("/([\x01-\x08\x0b-\x0c\x0e-\x1f])+/", ' ', $s);
    return $level == 1 ? $s."</root>" : $s;
}
/**
 * Json数据序列化为字符串
 * @version 1.4.0 首次引入
 * @params array $json 必需;json数据源
 * @return string $string 序列化后的字符串
 */
function DcJsonToSerialize($json){
    if($json_array = json_decode($json, true)){
        return serialize($json_array);
    }
    return $json;
}
/**
 * 将序列化字符串转化为json
 * @version 1.4.0 首次引入
 * @params array $string 必需;序列化后的数据
 * @return string $json json格式的字符串
 */
function DcSerializeToJson($string){
    $array = unserialize($string);
    if(is_array($array)){
        return json_encode($array);
    }
    return $string;
}
/**
 * 过滤数组中不需要的字段
 * @version 1.6.0 首次引入
 * @param array $array 必需;待过滤的数组
 * @param array $fileds 必需;需保留的字段
 * @param string $prefix 可选;KEY前缀
 * @param string $suffix 可选;KEY后缀
 * @return mixed $mixed array|value 过滤后的数组
 */
function DcArrayFilter($array=[], $fileds=[], $prefix='', $suffix=''){
    $filter = [];
    foreach($array as $key=>$value){
        if(in_array($key, $fileds)){
            $filter[$prefix.$key.$suffix] = $value;
        }
    }
    return $filter;
}
/**
 * 过滤数组中没有定义的字段
 * @version 1.6.0 首次引入
 * @param array $array 必需;待过滤的数组;默认：空
 * @param array $fileds 必需;需保留的字段;默认：空
 * @return mixed $mixed array|value 过滤后的数组
 */
function DcArrayIsset($array=[], $fileds=[]){
    foreach($array as $key=>$value){
        if(!in_array($key, $fileds)){
            unset($array[$key]);
        }
    }
    foreach($fileds as $key=>$value){
        if(!isset($array[$key])){
            unset($array[$key]);
        }
    }
    return $array;
}
/**
 * 给一个数组参数或者url字符串（args）绑定默认值
 * @version 1.5.26 首次引入
 * @param array $args 必需;数组参数列表
 * @param array $defaults 可选;数组默认值;默认：空
 * @return array $array 合并后的数组
 */
function DcArrayArgs($args, $defaults = ''){
	if ( is_array( $args ) ){
		$r =& $args;
    }else{
		parse_str( $args, $r );
    }
	if ( is_array( $defaults ) ){
		return array_merge( $defaults, $r );
    }
	return $r;
}
/**
 * 将数组序列化为字符串
 * @version 1.2.0 首次引入
 * @params array $array 必需;序列化后的数据
 * @return string $json json格式的字符串
 */
function DcArraySerialize($array){
    if(is_array($array)){
        return serialize($array);
    }
    return $array;
}
/**
 * 二维数组根据字段进行排序
 * @version 1.2.0 首次引入
 * @params array $array 必需;需要排序的数组
 * @params string $field 必须;排序的字段名;默认：空
 * @params string $sort 可选;排序顺序标志，SORT_DESC＝降序，SORT_ASC＝升序;默认：SORT_DESC
 * @return array $array 排序后的数组
 */
function DcArraySequence($array, $field, $sort = 'SORT_DESC'){
    $arrSort = array();
    foreach ($array as $uniqid => $row) {
        foreach ($row as $key => $value) {
            $arrSort[$key][$uniqid] = $value;
        }
    }
    array_multisort($arrSort[$field], constant($sort), $array);
    return $array;
}
/**
 * 在数据列表中搜索
 * @version 1.2.0 首次引入
 * @param array $list 数据列表
 * @param mixed $condition 查询条件,支持array('name'=>$value)或者name=$value
 * @param string $key 要返回的字段值
 * @return mixed $mixed array|value
 */
function DcArraySearch($array, $condition, $key=''){
    $array_search = list_search($array, $condition);
    if($key){
        return $array_search[0][$key];
    }
    return $array_search;
}
/**
 * 在指定的键之前插入元素
 * @version 1.6.0 首次引入
 * @param array $array 必需;原数组;默认：空
 * @param array $data 必需;要插入的值;默认：空
 * @param string $key 可选;键名值;默认：空
 * @return array $array 合并后的值
 */
function DcArrayPush($array, $data=null, $key=false){
    $data    = (array)$data;
    $offset  = ($key===false)?false:array_search($key, array_keys($array));
    $offset  = ($offset)?$offset:false;
    if($offset){
        return array_merge(
            array_slice($array, 0, $offset), 
            $data, 
            array_slice($array, $offset)
        );
    }else{     // 没指定 $key 或者找不到，就直接加到末尾
        return array_merge($array, $data);
    }
}
/**
 * 将数据集转化为数组
 * @version 1.6.0 首次引入
 * @param mixed $data 必需;需验请的数据集;默认：空
 * @return mixed $mixed array|null
 */
function DcArrayResult($data=[]){
    if(is_null($data)){
        return null;
    }
    if(is_object($data)){
        return $data->toArray();
    }
    return $data;
}
/**
 * 判断是否为数组(count为false时普通一维数组)
 * @version 1.4.0 首次引入
 * @param array $array 待验证的数组
 * @param bool $count 验证是否一维数组
 * @return bool true|false 真或假
 */
function DcIsArray($array, $count=false){
    if($count == false){
        return is_array($array);
    }
    if (count($array) == count($array, 1)) {
        return true;
    } else {
        return false;
    }
}

/**************************************************ThinkPhp语言***************************************************/
/**
 * 加载语言定义(不区分大小写)
 * @version 1.0.0 首次引入
 * @param string $file 必需;语言文件
 * @param string $range 可选;语言作用域;默认：空
 * @return mixed $mixed 语言配置信息
 */
function DcLoadLang($file, $range = ''){
    return \think\Lang::load($file, $range);
}

/**************************************************ThinkPhp验证器***************************************************/
/**
* 验证器独立验证
* @version 1.2.0 首次引入
* @param array $data 必需;待验证数据
* @param string $name 必需;验证器名称;默认：空
* @param string $scene 可选;验证场景,多个用逗号分隔;默认：空
* @param string $layer 可选;业务层名称;默认：validate
* @return bool $bool 验证失败时可使用cofig('daicuo.error')获取出错信息
*/
function DcCheck($data = [], $name, $scene='', $layer='validate'){
    $validate = validate($name, $layer);
    if(!$validate->scene($scene)->check($data)){
        config('daicuo.error', $validate->getError());
        return false;
    }
    return true;
}

/**************************************************ThinkPhp缓存***************************************************/
/**
 * 缓存标识处理函数、支持清空缓存(value=false)
 * @version 1.0.0 首次引入
 * @param string $key 必需;缓存KEY
 * @param string|array $value 必需;缓存数据（空|clear|false|data值）;默认：空
 * @param intval $time 可选;缓存时间;默认：0
 * @return mixed $mixed 缓存处理结果
 */
function DcCache($key, $value='', $time=0){
    if(!$key){
        return false;
    }
    if(is_null($value)){
        return \think\Cache::rm($key);//DcCache('key',null);
    }
    if($value === false || $value == 'clear'){
        return \think\Cache::clear();
    }
    if($value){
        return \think\Cache::set($key, $value, $time);
    }
    return \think\Cache::get($key);
}
/**
 * 缓存标签处理函数、支持清空缓存(value=false)
 * @version 1.0.0 首次引入
 * @param string $tag 必需;缓存标签名
 * @param string $key 必需;缓存标识KEY;默认：空
 * @param string|array $value 必需;缓存数据（空|clear|false|data值）;默认：空
 * @param intval $time 可选;缓存时间;默认：0
 * @return mixed $mixed 缓存结果
 */
function DcCacheTag($tag, $key, $value='', $time=0){
    if(!$tag){
        return false;
    }
    if(!$key){
        return false;
    }
    if($key == 'clear' && $value == ''){
        return \think\Cache::clear($tag);//DcCacheTag('tag','clear');
    }
    if($value === false || $value == 'clear'){
        return \think\Cache::clear($tag);//DcCacheTag('tag','clear','clear');
    }
    if($value){
        return \think\Cache::tag($tag)->set($key, $value, $time);//DcCacheTag('tag','key','value',60);
    }
    return \think\Cache::get($key);
}
/**
 * 数据库结果处理后触发删除缓存
 * @version 1.0.0 首次引入
 * @param int|obj $result 必需;结果记录数或者数据集
 * @param string $cacheSign 可选;缓存标记（标识名或者标签名）;默认：空
 * @param string $delType 可选;缓存删除方式(key|tag);默认：key
 * @return mixed $mixed obj|array数据库查询对象
 */
function DcCacheResult($result, $cacheSign, $delType='key'){
    if($result && $cacheSign){
        if($delType == 'tag'){
            DcCacheTag($cacheSign, 'tag', false);
        }else{
            DcCache($cacheSign, NULL);
        }
    }
    return $result;
}
/**
 * 生成缓存KEY名
 * @version 1.2.0 首次引入
 * @param string|array $value 必需;缓存名格式化
 * @return string $string 缓存KEY
 */
function DcCacheKey($value){
    if(is_array($value)){
        return md5(serialize($value));
    }
    return md5($value);
}

/**************************************************ThinkPhp路径***************************************************/
/**
 * 获取系统根目录
 * @version 1.0.0 首次引入
 * @return string $string 框架根目录路径
 */
function DcRoot(){
    $base = \think\Request::instance()->root();
    return ltrim(dirname($base), DS).'/';
}
/**
 * 提取网址的域名
 * @version 1.0.0 首次引入
 * @return string $string 框架根目录路径
 */
function DcDomain($url=''){
    $url = parse_url($url);
    return $url['host'];
}
/**
 * 生成站内链接
 * @version 1.1.0 首次引入
 * @param string $url 必需;调用地址
 * @param string|array $vars 可选;调用参数，支持字符串和数组;默认：空
 * @param bool $suffix 可选;是否添加类名后缀;默认：true
 * @return string $string 站内链接
 */
function DcUrl($url = '', $vars = '', $suffix = true){
    if(config('common.app_domain') == 'on'){
        return strip_tags(url($url, $vars, $suffix, true));
    }else{
        return strip_tags(url($url, $vars, $suffix, false));
    }
}
/**
 * 后台生成前台路径
 * @version 1.1.0 首次引入
 * @param string $url 必需;调用地址
 * @param string|array $vars 可选;调用参数 支持字符串和数组;默认：空
 * @param bool $suffix 可选;是否添加类名后缀;默认：true
 * @return string $string 后台专用生成前台链接
 */
function DcUrlAdmin($url = '', $vars = '', $suffix = true){
	$baseFile = request()->baseFile();
	return str_replace($baseFile, '', DcUrl($url, $vars, $suffix));
}
/**
 * 后台插件管理路径
 * @version 1.2.0 首次引入
 * @param array $vars 必需;地址栏参数
 * @param bool $suffix 可选;是否添加类名后缀;默认：true
 * @return string $string 后台插件访问地址
 */
function DcUrlAddon($vars = '', $suffix = true){
    return DcUrl('addon/index', $vars, '');
    //return '../addon/index?'.http_build_query($vars);
}
/**
 * 附件读取路径
 * @version 1.3.0 首次引入
 * @param string $file 必需;文件保存的路径
 * @param int $key 可选;key值、第几张;默认：0
 * @return string $string 附件访问地址
 */
function DcUrlAttachment($file, $key=0){
    //必要参数
    if(!$file){
        return '';
    }
    //多图分割
    $file = explode(';',$file);
    //当前第几个
    $file = $file[$key];
    //判断本地附件还是远程附件
    $array = parse_url($file);
    //远程附件处理
	if(in_array($array['scheme'], array('http','https','ftp'))){
        //第三方防盗链附盗链开关
		if( config('common.upload_referer') ){
			return config('common.upload_referer').urlencode($file);
		}
        //直接返回绝对地址
		return $file;
	}
    //本地附件URL接口开关
    if(config('common.upload_host')){
        return config('common.upload_host').urlencode($file);
    }
    //本地附件CDN加速开关
    if(config('common.upload_cdn')){
        return trim(config('common.upload_cdn')).DcRoot().trim(config('common.upload_path')).'/'.$file;
    }
    //相对路径直接返回真实路径
    return DcRoot().trim(config('common.upload_path')).'/'.$file;
}

/****************************************************ThinkPhp配置***************************************************/
/**
* 获取系统配置.支持多级层次
* @version 1.2.0 首次引入
* @param string $name 必需;配置名称;默认：空
* @return mixed $mixed 获取到的配置值
*/
function DcConfig($name=''){
    if(!$name){
        return false;
    }
    $data = config();
    foreach (explode('.', $name) as $key => $val) {
        if (isset($data[$val])) {
            $data = $data[$val];
        } else {
            $data = null;
            break;
        }
    }
    return $data;
}
/**
 * 加载配置文件（PHP格式）
 * @version 1.0.0 首次引入
 * @param string $file 必需;配置文件名;默认：空
 * @param string $name 可选;配置名（如设置即表示二级配置）;默认：空
 * @param string $range 可选;作用域;默认：空
 * @return mixed $mixed 配置信息
 */
function DcConfigLoad($file, $name = '', $range = ''){
    return \think\Config::load($file, $name, $range);
}
/**
* 合并配置信息
* @version 1.4.0 首次引入
* @param string $config_name 必需;配置名称;默认空
* @param string $config_value 必需;新配置值;默认空
* @return mixed $mixed 合并后的配置值
*/
function DcConfigMerge($config_name='', $config_value=''){
    if( !is_array($config_value) ){
        return false;
    }
    //旧配置
    $config_name = trim($config_name);
    $config_value_old = config($config_name);
    if( is_string($config_value_old) ){
        $config_value_old = [$config_value_old];
    }elseif( is_null($config_value_old) ){
        $config_value_old = [];
    }
    if( !is_array($config_value_old) ){
        return false;
    }
    return config($config_name, array_merge($config_value_old, $config_value));
}
/**
 * 批量更新与新增动态配置、常用于需自动加载的配置
 * @version 1.6.0 首次引入
 * @param array $formData 必需;表单数据(key=>value)成对形式;默认：空
 * @param string $module 必需;模块名称;默认：common
 * @param string $controll 可选;控制器名;默认：NULL
 * @param string $action 可选;操作名;默认：NULL
 * @param int $order 可选;排序值;默认：0
 * @param string $autoload 可选;自动加载;默认：yes
 * @param string $status 可选;状态;默认：normal
 * @return array $array 数据集
 */
function DcConfigWrite($formData=[], $module='common', $controll=NULL, $action=NULL, $order=0, $autoload='yes', $status='normal'){
    return \daicuo\Op::write($formData, $module, $controll, $action, $order, $autoload, $status);
}
/**
 * 添加动态配置至数据库
 * @version 1.6.0 首次引入
 * @param array $data 必需;普通表单数组形式;默认：空
 * @return mixed $mixed 自增ID
 */
function DcConfigSave($data=[]){
    //数据过滤
    $data = DcArrayIsset($data, ['op_name','op_value','op_module','op_controll','op_action','op_order','op_status','op_autoload']);
    //合并初始参数
    $data = DcArrayArgs($data,[
        'op_module'    => 'common',
        'op_controll'  => 'common',
        'op_action'    => 'common',
        'op_order'     => 0,
        'op_autoload'  => 'yes',
        'op_status'    => 'normal',
    ]);
    return \daicuo\Op::save($array);
}
/**
 * 批量添加动态配置至数据库
 * @version 1.6.0 首次引入
 * @param array $data 必需;二维数组;默认：空
 * @return obj $obj 多条数据集
 */
function DcConfigSaveAll($data=[]){
    foreach($data as $key=>$value){
        if(!$value['op_name']){
            unset($data[$key]);
            continue;
        }
    }
    return \daicuo\Op::save_all($data);
}
/**
 * 按条件删除一条动态配置
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称;默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @return mixed $mixed 查询结果（array|null）
 */
function DcConfigDelete($args=[]){

    if(!$where = $args['where']){
        $where = DcWhereFilter($args, ['module','controll','action','status','id','name'], 'eq', 'op_');
    }

    return \daicuo\Op::delete($where);
}
/**
 * 按ID条件删除一条动态配置
 * @version 1.6.0 首次引入
 * @param mixed $value 必需;Id值/多个用逗号分隔或者数组(string|array)；默认：空
 * @return mixed $mixed 删除结果(obj|null)
 */
function DcConfigDeleteId($value=''){
    return \daicuo\Op::delete_id($value);
}
/**
 * 按条件删除多条动态配置
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称;默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @return mixed $mixed 查询结果（array|null）
 */
function DcConfigDeleteAll($args=[]){
    if(!$where = $args['where']){
        $where = DcWhereFilter($args, ['module','controll','action','status','id','name'], 'eq', 'op_');
    }
    return \daicuo\Op::delete_all($where);
}
/**
 * 按条件删除一条数组配置指定的KEY
 * @version 1.6.0 首次引入
 * @param array $where 查询条件（一维数组）
 * @param string $opValueKey 数组KEY值
 * @return mixed $mixed 操作结果(array|false)
 */
function DcConfigDeleteKey($where=[], $opValueKey=''){
    if($where && $opValueKey){
        return \daicuo\Op::delete_value_key($where, $opValueKey);
    }
    return false;
}
/**
 * 按条件修改配置列表
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称;默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @param array $data 必需;待修改的数据（普通表单数组形式）;默认：空
 * @return mixed $mixed 查询结果（array|null）
 */
function DcConfigUpdate($args=[], $data=[]){
    if(!$where = $args['where']){
        $where = DcWhereFilter($args, ['module','controll','action','status','id','name'], 'eq', 'op_');
    }
    return \daicuo\Op::update($where, $data);
}
/**
 * 按Id修改一个配置
 * @param int $opId 必需;ID值;默认：空
 * @param array $data 必需;表单数据（一维数组）;默认：空 
 * @return mixed $mixed obj|null;不为空时返回obj
 */
function DcConfigUpdateId($opId, $data){
    return \daicuo\Op::update_id($opId, $data);
}
/**
 * 按条件更新一条数组配置指定的KEY
 * @version 1.6.0 首次引入
 * @param array $where 查询条件（一维数组）
 * @param string $opValueKey 数组KEY值
 * @param string $opValueData 数组Value
 * @return mixed $mixed 操作结果(array|false)
 */
function DcConfigUpdateKey($where=[], $opValueKey='', $opValueData=''){
    return \daicuo\Op::update_value_key($where, $opValueKey, $opValueData);
}
/**
 * 按条件更新一条数组配置的多个数组值
 * @version 1.6.0 首次引入
 * @param array $where 必需;查询条件（一维数组）;默认：空
 * @param array $opValueData 必需;key=>Value类型的数据;默认：空
 * @return mixed $mixed 更新结果（obj|false）
 */
function DcConfigUpdateArray($where=[], $opValueData=''){
    return \daicuo\Op::update_value_array($where, $opValueData);
}
/**
 * 按条件获取一个配置列表
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：true
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称;默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @return mixed $mixed 查询结果（array|null）
 */
function DcConfigFind($args=[]){
    $cache = DcBool($args['cache'],true);
    
    if(!$where = $args['where']){
        $where = DcWhereFilter($args, ['module','controll','action','status','id','name'], 'eq', 'op_');
    }

    return \daicuo\Op::get($where, $cache);
}
/**
 * 按条件获取多个配置列表
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：true
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type string $field 可选;查询字段;默认：*
 *     @type int $limit 可选;分页大小;默认：0
 *     @type int $page 可选;当前分页;默认：0
 *     @type string $sort 可选;排序字段名;默认：op_order
 *     @type string $order 可选;排序方式(asc|desc);默认：asc
 *     @type array $where 可选;自定义高级查询条件;默认：空
 *     @type array $paginate 可选;自定义高级分页参数;默认：空
 * }
 * @return mixed $mixed 查询结果（obj|null）
 */
function DcConfigSelect($args=[]){
    $defaults = array();
    if(!$args['where']){
        $defaults['where'] = DcWhereFilter($args, ['module','controll','action','status'], 'eq', 'op_');
    }
    if(!$args['paginate']){
        $defaults['paginate'] = DcPageFilter($args);
    }
    return \daicuo\Op::all( DcArrayArgs($args, $defaults) );
}

/**************************************************ThinkPhp钩子***************************************************/
/**
* 动态添加行为扩展到某个标签
* @version 1.2.0 首次引入
* @param string $tag 必需;标签名称
* @param mixed $behavior 必需;行为名称
* @param bool $first 可选;是否放到开头执行;默认：false
* @return void $void 不返回值
*/
function DcHookAdd($tag, $behavior, $first = false){
    \think\Hook::add($tag, $behavior, $first);
}
/**
 * 监听标签的行为
 * @version 1.2.0 首次引入
 * @param string $tag 必需;标签名称
 * @param mixed $params 可选;传入参数;默认：null
 * @param mixed $extra 可选;额外参数;默认：null
 * @param bool $once 可选;只获取一个有效返回值;默认：false
 * @return void $void 不返回值
 */
function DcHookListen($tag, &$params = null, $extra = null, $once = false){
    \think\Hook::listen($tag, $params, $extra, $once);
}
/**
 * 执行某个标签行为
 * @version 1.2.0 首次引入
 * @param mixed $class 必需;要执行的行为
 * @param string $tag 可选;方法名（标签名）;默认：空
 * @param mixed $params 可选;传入的参数;默认：null
 * @param mixed $extra 可选;额外参数;默认：null
 * @return void $void 不返回值
 */
function DcHookExec($class, $tag = '', &$params = null, $extra = null){
    \think\Hook::exec($class, $tag, $params, $extra);
}
/**
 * 添加一个动态钩子至数据库
 * @version 1.6.0 首次引入
 * @param array $data 必需;普通表单数组形式;默认：空
 * @return mixed $mixed 自增ID
 */
function DcHookSave($data=[]){
    return \daicuo\Hook::save($data);
}
/**
 * 批量添加动态钩子至数据库
 * @version 1.6.0 首次引入
 * @param array $data 必需;二维数组;默认：空
 * @return obj $obj 多条数据集
 */
function DcHookSaveAll($data=[]){
    return \daicuo\Hook::save_all($data);
}
/**
 * 按条件删除一条动态钩子
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称;默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @return mixed $mixed 查询结果（array|null）
 */
function DcHookDelete($args=[]){

    if(!$where = $args['where']){
        $where = DcWhereFilter($args, ['module','controll','action','status','id'], 'eq', 'op_');
    }

    return \daicuo\Hook::delete($where);
}
/**
 * 按ID条件删除一条动态钩子
 * @version 1.6.0 首次引入
 * @param mixed $value 必需;Id值/多个用逗号分隔或者数组(string|array)；默认：空
 * @return mixed $mixed 删除结果(obj|null)
 */
function DcHookDeleteId($value=''){
    return \daicuo\Hook::delete_id($value);
}
/**
 * 按条件修改一条动态钩子
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称(site_hook);默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @param array $data 必需;待修改的数据（普通表单数组形式）;默认：空
 * @return mixed $mixed 查询结果（array|null）
 */
function DcHookUpdate($args=[], $data=[]){
    if(!$where = $args['where']){
        $where = DcWhereFilter($args, ['module','controll','action','status','id','name'], 'eq', 'op_');
    }
    return \daicuo\Hook::update($where, $data);
}
/**
 * 按Id修改一个动态钩子
 * @param int $opId 必需;ID值;默认：空
 * @param array $data 必需;表单数据（一维数组）;默认：空 
 * @return mixed $mixed obj|null;不为空时返回obj
 */
function DcHookUpdateId($opId, $data){
    return \daicuo\Hook::update_id($opId, $data);
}
/**
 * 按条件获取一个动态钩子
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：true
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称(site_hook);默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @return mixed $mixed 查询结果（array|null）
 */
function DcHookFind($args=[]){
    $cache = DcBool($args['cache'], true);
    if(!$where = $args['where']){
        $where = DcWhereFilter($args, ['module','controll','action','status','id','name'], 'eq', 'op_');
    }
    return \daicuo\Hook::get($where, $cache);
}
/**
 * 按条件获取多个动态钩子
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：true
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type string $field 可选;查询字段;默认：*
 *     @type int $limit 可选;分页大小;默认：0
 *     @type int $page 可选;当前分页;默认：0
 *     @type string $sort 可选;排序字段名;默认：op_order
 *     @type string $order 可选;排序方式(asc|desc);默认：asc
 *     @type array $where 可选;自定义高级查询条件;默认：空
 *     @type array $paginate 可选;自定义高级分页参数;默认：空
 * }
 * @return mixed $mixed 查询结果（obj|null）
 */
function DcHookSelect($args=[]){
    $defaults = array();
    if(!$args['where']){
        $defaults['where'] = DcWhereFilter($args, ['module','controll','action','status'], 'eq', 'op_');
    }
    if(!$args['paginate']){
        $defaults['paginate'] = DcPageFilter($args);
    }
    return \daicuo\Hook::all( DcArrayArgs($args, $defaults) );
}

/**************************************************ThinkPhp路由***************************************************/
/**
 * 添加一个路由至数据库
 * @version 1.6.0 首次引入
 * @param array $data 必需;普通表单数组形式;默认：空
 * @return mixed $mixed 自增ID
 */
function DcRouteSave($data=[]){
    return \daicuo\Route::save($data);
}
/**
 * 批量添加路由至数据库
 * @version 1.6.0 首次引入
 * @param array $data 必需;二维数组;默认：空
 * @return obj $obj 多条数据集
 */
function DcRouteSaveAll($data=[]){
    return \daicuo\Route::save_all($data);
}
/**
 * 按条件删除一条路由
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称;默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @return mixed $mixed 查询结果（array|null）
 */
function DcRouteDelete($args=[]){

    if(!$where = $args['where']){
        $where = DcWhereFilter($args, ['module','controll','action','status','id'], 'eq', 'op_');
    }

    return \daicuo\Route::delete($where);
}
/**
 * 按ID条件删除一条动态配置
 * @version 1.6.0 首次引入
 * @param mixed $value 必需;Id值/多个用逗号分隔或者数组(string|array)；默认：空
 * @return mixed $mixed 删除结果(obj|null)
 */
function DcRouteDeleteId($value=''){
    return \daicuo\Route::delete_id($value);
}
/**
 * 按条件修改一条路由
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称(site_rotue);默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @param array $data 必需;待修改的数据（普通表单数组形式）;默认：空
 * @return mixed $mixed 查询结果（array|null）
 */
function DcRouteUpdate($args=[], $data=[]){
    if(!$where = $args['where']){
        $where = DcWhereFilter($args, ['module','controll','action','status','id','name'], 'eq', 'op_');
    }
    return \daicuo\Route::update($where, $data);
}
/**
 * 按Id修改一条路由
 * @param int $opId 必需;ID值;默认：空
 * @param array $data 必需;表单数据（一维数组）;默认：空 
 * @return mixed $mixed obj|null;不为空时返回obj
 */
function DcRouteUpdateId($opId, $data){
    return \daicuo\Route::update_id($opId, $data);
}
/**
 * 按条件获取一条路由
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：true
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称(site_rotue);默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @return mixed $mixed 查询结果（array|null）
 */
function DcRouteFind($args=[]){
    $cache = DcBool($args['cache'], true);
    if(!$where = $args['where']){
        $where = DcWhereFilter($args, ['module','controll','action','status','id','name'], 'eq', 'op_');
    }
    return \daicuo\Route::get($where, $cache);
}
/**
 * 按条件获取多个路由
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：true
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type string $field 可选;查询字段;默认：*
 *     @type int $limit 可选;分页大小;默认：0
 *     @type int $page 可选;当前分页;默认：0
 *     @type string $sort 可选;排序字段名;默认：op_order
 *     @type string $order 可选;排序方式(asc|desc);默认：asc
 *     @type array $where 可选;自定义高级查询条件;默认：空
 *     @type array $paginate 可选;自定义高级分页参数;默认：空
 * }
 * @return mixed $mixed 查询结果（obj|null）
 */
function DcRouteSelect($args=[]){
    $defaults = array();
    if(!$args['where']){
        $defaults['where'] = DcWhereFilter($args, ['module','controll','action','status'], 'eq', 'op_');
    }
    if(!$args['paginate']){
        $defaults['paginate'] = DcPageFilter($args);
    }
    return \daicuo\Route::all( DcArrayArgs($args, $defaults) );
}

/**************************************************ThinkPhp模板***************************************************/
/**
 * 获取模板主题存放目录路径
 * @version 1.1.0 首次引入
 * @param string $module 必需;模块名称
 * @param bool $isMobile 必需;是否移动端
 * @return string $string 模板主题路径
 */
function DcViewPath($module, $isMobile){
    return 'apps/'.$module.'/theme/'.DcTheme($module, $isMobile).'/';
}
/**
 * 模板主题目录名称
 * @version 1.1.0 首次引入
 * @param string $module 必需;模块名称;默认：index
 * @param bool $isMobile 必需;是否移动端;默认：false
 * @return string $string 模板主题名称
 */
function DcTheme($module='index', $isMobile=false){
    if($isMobile){
        return DcEmpty(config($module.'.theme_wap'),config('common.wap_theme'));
    }
    return DcEmpty(config($module.'.theme'),config('common.site_theme'));
}
/**
 * 生成模板调用配置标签
 * @version 1.4.0 首次引入
 * @param string $module 模块
 * @param string $field 字段
 * @return string $string 原生输出;
 */
function DcTplLabelOp($module='', $field=''){
    return DcHtml('{:config("'.$module.'.'.$field.'")}');
}

/**************************************************视频模块***************************************************/
/**
 * 调用播放器
 * @version 1.4.0 首次引入
 * @param array $options 播放器参数，数组格式
 * @return string $string html代码
 */
function DcPlayer($options=[]){
    $video = new \daicuo\Video();
    return $video->player($options);
}

/**************************************************编辑器模块***************************************************/
/**
 * 调用编辑器解析函数
 * @version 1.6.0 首次引入
 * @param string $content 内容
 * @return mixed $mixed 解析后的内容
 */
function DcEditor($content=''){
    if(config('common.function_editor') && $content){
        return call_user_func_array(config('common.function_editor'), [$content]);
    }
    return $content;
}

/**************************************************表单模块***************************************************/
/**
 * 生成表单元素
 * @version 1.1.0 首次引入
 * @param array $args 表单元素参数列表
 * @return string $string 返回渲染后的表单HTML代码
 */
function DcBuildForm($args=[]){
    return widget('common/Form/build', ['args'=>$args]);
}

/**************************************************表格模块***************************************************/
/**
 * 生成表格数据
 * @version 1.1.0 首次引入
 * @param array $config 表格参数列表
 * @return string $string 返回渲染后的表单HTML代码
 */
function DcBuildTable($args=[]){
    return widget('common/Table/build', ['args'=>$args]);
}

/**************************************************分页模块***************************************************/
/**
 * 解析页码为HTML
 * @version 1.1.0 首次引入
 * @param number $index 当前页
 * @param number $rows 每页数量 
 * @param number $total 总记录数
 * @param string $path URL路径
 * @param array $query URL额为参数
 * @param string $fragment URL锚点 
 * @param string $varpage 分页变量
 * @return string $string HTML代码
 */
function DcPage($index=1, $rows=10, $total=1, $path='', $query=[], $fragment='', $varpage='page'){
    $page = new \page\Bootstrap('', $rows, $index, $total, false, [
        'var_page' => $varpage,
        'path'     => str_replace('%5BPAGE%5D','[PAGE]',$path),//url('index/index/index','','')
        'query'    => $query,
        'fragment' => $fragment,
    ]);
    return $page->render();
}
/**
 * 单页分页代码HTML
 * @version 1.1.0 首次引入
 * @param number $index 当前页
 * @param number $total 总页数 
 * @return string $string HTML代码
 */
function DcPageSimple($index=1, $total=1, $path='', $query=[], $fragment='', $varpage='page'){
    $page = new \page\Bootstrap('', '', $index, $total, true, [
        'var_page' => $varpage,
        'path'     => str_replace('%5BPAGE%5D','[PAGE]',$path),
        'query'    => $query,
        'fragment' => $fragment,
    ]);
    return $page->render();
}
/**
 * 根据字段过滤分页参数、只保留默认两个
 * @version 1.6.0 首次引入
 * @param array $args 必需;参数列表
 * @return array $array 只返回字段中的条件语句
 */
function DcPageFilter($args=[]){
    if($args['limit'] && $args['page']){
        return [
            'list_rows' => $args['limit'],
            'page' => $args['page'],
        ];
    }
    return [];
}

/**************************************************导航模块***************************************************/
/**
 * 添加一个导航至数据库
 * @version 1.6.0 首次引入
 * @param array $data 必需;普通表单数组形式;默认：空
 * @return mixed $mixed 自增ID
 */
function DcNavSave($data=[]){
    return \daicuo\Nav::save($data);
}
/**
 * 批量添加导航至数据库
 * @version 1.6.0 首次引入
 * @param array $data 必需;二维数组;默认：空
 * @return obj $obj 多条数据集
 */
function DcNavSaveAll($data=[]){
    return \daicuo\Nav::save_all($data);
}
/**
 * 按条件删除导航
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称;默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @return mixed $mixed 查询结果（array|null）
 */
function DcNavDelete($args=[]){

    if(!$where = $args['where']){
        $where = DcWhereFilter($args, ['module','controll','action','status','id'], 'eq', 'op_');
    }

    return \daicuo\Nav::delete($where);
}
/**
 * 按ID条件删除动态配置
 * @version 1.6.0 首次引入
 * @param mixed $value 必需;Id值/多个用逗号分隔或者数组(string|array)；默认：空
 * @return mixed $mixed 删除结果(obj|null)
 */
function DcNavDeleteId($value=''){
    return \daicuo\Nav::delete_id($value);
}
/**
 * 按条件修改导航
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称(site_rotue);默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @param array $data 必需;待修改的数据（普通表单数组形式）;默认：空
 * @return mixed $mixed 查询结果（array|null）
 */
function DcNavUpdate($args=[], $data=[]){
    if(!$where = $args['where']){
        $where = DcWhereFilter($args, ['module','controll','action','status','id','name'], 'eq', 'op_');
    }
    return \daicuo\Nav::update($where, $data);
}
/**
 * 按Id修改一个导航
 * @param int $opId 必需;ID值;默认：空
 * @param array $data 必需;表单数据（一维数组）;默认：空 
 * @return mixed $mixed obj|null;不为空时返回obj
 */
function DcNavUpdateId($opId, $data){
    return \daicuo\Nav::update_id($opId, $data);
}
/**
 * 按条件获取一个导航
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：true
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称(site_rotue);默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @return mixed $mixed 查询结果（array|null）
 */
function DcNavFind($args=[]){
    $cache = DcBool($args['cache'], true);
    if(!$where = $args['where']){
        $where = DcWhereFilter($args, ['module','controll','action','status','id','name'], 'eq', 'op_');
    }
    return \daicuo\Nav::get($where, $cache);
}
/**
 * 获取网站导航列表
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：true
 *     @type bool $tree 可选;是否转化为树型;默认：false
 *     @type bool $level 可选;是否将树型还原为层级结构;默认：false
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称;默认：空
 *     @type string $field 可选;查询字段;默认：*
 *     @type int $limit 可选;分页大小;默认：0
 *     @type int $page 可选;当前分页;默认：0
 *     @type string $sort 可选;排序字段名;默认：op_order
 *     @type string $order 可选;排序方式(asc|desc);默认：asc
 *     @type array $where 可选;自定义高级查询条件;默认：空
 *     @type array $paginate 可选;自定义高级分页参数;默认：空
 * }
 * @return mixed $mixed obj|null 查询结果
 */
function DcNavSelect($args=[]){
    $defaults = array();
    if(!$args['where']){
        $defaults['where'] = DcWhereFilter($args, ['module','controll','action','status'], 'eq', 'op_');
    }
    if(!$args['paginate']){
        $defaults['paginate'] = DcPageFilter($args);
    }
    return \daicuo\Nav::all( DcArrayArgs($args, $defaults) );
}
/**
 * 获取导航列表简单数组格式用于
 * @version 1.3.0 首次引入
 * @param array $args 可选;array;查询条件，其属性值如下 {
 *     @type array $where 可选;where查询条件;默认：空
 *     @type bool $cache 可选;是否缓存;默认：false
 * }
 * @return mixed $mixed null|array
 */
function DcNavOption($args=[]){
    $defaults = array();
    if(!$args['where']){
        $defaults['where'] = DcWhereQuery(['op_module','op_controll','op_action'],'eq');
    }
    $defaults['cache'] = false;
    $defaults['where']['op_status'] = ['eq','normal'];
    return \daicuo\Nav::option( DcArrayArgs($args, $defaults) );
}

/**************************************************用户模块***************************************************/
/**
 * 获取权限列表简单数组格式
 * @version 1.3.0 首次引入
 * @return array $array 数组
 */
function DcRolesOption(){
    $options = [];
    foreach(\daicuo\Auth::get_roles() as $role){
        $options[$role] = lang($role);
    }
    return $options;
}

/**************************************************分类模块***************************************************/
/**
 * 添加一个导航至数据库
 * @version 1.6.0 首次引入
 * @param array $data 必需;普通表单数组形式;默认：空
 * @return mixed $mixed 自增ID
 */
function DcCategorySave($data=[]){
    $data = DcArrayArgs($data,[
        'term_status'     => 'normal',
        'term_order'      => 0,
        'term_much_type'  => 'category',
    ]);
    return \daicuo\Term::save($data,'term_much,term_meta');
}
/**
 * 批量添加分类至数据库
 * @version 1.6.0 首次引入
 * @param array $data 必需;二维数组;默认：空
 * @return obj $obj 多条数据集
 */
function DcCategorySaveAll($data=[]){
    return \daicuo\Term::save_all($data);
}
/**
 * 按条件删除一条分类
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称;默认：空
 *     @type string $slug 可选;配置名称;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @return mixed $mixed 查询结果（array|null）
 */
function DcCategoryDelete($args=[]){
    if(!$where = $args['where']){
        $where = DcWhereFilter($args, ['id','name','slug','module','status'], 'eq', 'term_');
    }
    return \daicuo\Term::delete($where, 'term_much,term_meta');
}
/**
 * 按ID条件删除一条分类
 * @version 1.6.0 首次引入
 * @param int $value 必需;Id值;默认：空
 * @return bool $bool true|false
 */
function DcCategoryDeleteId($id=''){
    return \daicuo\Term::delete_id($id);
}
/**
 * 按ID条件删除多条分类
 * @version 1.6.0 首次引入
 * @param mixed $ids 必需;Id值/多个用逗号分隔或者数组(string|array);默认：空
 * @return array $array 多条删除结果
 */
function DcCategoryDeleteIds($ids=''){
    return \daicuo\Term::delete_ids($ids);
}
/**
 * 按条件修改一个分类
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type int $id 可选;分类ID;默认：空
 *     @type string $name 可选;分类名称;默认：空
 *     @type string $slug 可选;分类别名;默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @param array $data 必需;待修改的数据（普通表单数组形式）;默认：空
 * @return mixed $mixed 查询结果（array|null）
 */
function DcCategoryUpdate($args=[], $data=[]){
    if(!$where = $args['where']){
        $where = DcWhereFilter($args, ['id','name','slug','module','status'], 'eq', 'term_');
    }
    return \daicuo\Term::update($where, $data, 'term_much,term_meta');
}
/**
 * 按Id修改一个分类
 * @param int $id 必需;ID值;默认：空
 * @param array $data 必需;表单数据（一维数组）;默认：空 
 * @return mixed $mixed obj|null
 */
function DcCategoryUpdateId($id, $data){
    return \daicuo\Term::update_id($id, $data);
}
/**
 * 按条件获取一个分类
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：true
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type int $id 可选;分类ID;默认：空
 *     @type string $name 可选;分类名称;默认：空
 *     @type string $slug 可选;分类别名;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type mixed $much_id 可选;类型ID(int|array);默认：空
 *     @type mixed $much_info 可选;分类描述(stirng|array);默认：空
 *     @type mixed $much_parent 可选;父级ID(int|array);默认：空
 *     @type mixed $much_count 可选;数量统计(int|array);默认：空
 *     @type mixed $meta_key 可选;扩展字段限制条件(string|array);默认：空
 *     @type mixed $meta_value 可选;扩展字段值限制条件(string|array);默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @return mixed $mixed 查询结果（array|null）
 */
function DcCategoryFind($args=[]){
    $defaults = array();
    if(!$args['where']){
        $defaults['where'] = DcWhereFilter($args, ['id','name','slug','module','status','much_id','much_info','much_parent','much_count','meta_key','meta_value'], 'eq', 'term_');
    }
    $defaults['where']['term_much_type'] = ['eq','category'];
    return \daicuo\Term::get( DcArrayArgs($args, $defaults) );
}
/**
 * 按ID条件获取一条分类
 * @version 1.6.0 首次引入
 * @param int $id 必需;Id值；默认：空
 * @return mixed $mixed 查询结果(obj|null)
 */
function DcCategoryFindId($id='', $cache=true){
    return \daicuo\Term::get_id($id, $cache);
}
/**
 * 获取多条分类数据（适用于term/termMuch两表条件限制）
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：true
 *     @type bool $tree 可选;是否转化为树型;默认：false
 *     @type bool $level 可选;是否将树型还原为层级结构;默认：false
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称;默认：空
 *     @type string $slug 可选;配置名称;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type mixed $much_id 可选;类型ID(int|array);默认：空
 *     @type mixed $much_info 可选;分类描述(stirng|array);默认：空
 *     @type mixed $much_parent 可选;父级ID(int|array);默认：空
 *     @type mixed $much_count 可选;数量统计(int|array);默认：空
 *     @type string $field 可选;查询字段;默认：*
 *     @type int $limit 可选;分页大小;默认：0
 *     @type int $page 可选;当前分页;默认：0
 *     @type string $sort 可选;排序字段名(term_id|term_order|term_much_id|trem_much_count);默认：op_order
 *     @type string $order 可选;排序方式(asc|desc);默认：asc
 *     @type array $where 可选;自定义高级查询条件;默认：空
 *     @type array $paginate 可选;自定义高级分页参数;默认：空
 * }
 * @return mixed $mixed obj|null 查询结果
 */
function DcCategorySelect($args=[]){
    $defaults = array();
    if(!$args['where']){
        $defaults['where'] = DcWhereFilter($args, ['id','name','slug','module','status','much_id','much_info','much_parent','much_count'], 'eq', 'term_');
    }
    if(!$args['paginate']){
        $defaults['paginate'] = DcPageFilter($args);
    }
    $defaults['where']['term_much_type'] = ['eq','category'];
    return \daicuo\Term::all( DcArrayArgs($args, $defaults) );
}
/**
 * 获取多条分类数据（适用于term/termMuch两表条件限制）
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：true
 *     @type bool $tree 可选;是否转化为树型;默认：false
 *     @type bool $level 可选;是否将树型还原为层级结构;默认：false
 *     @type int $id 可选;配置ID;默认：空
 *     @type string $name 可选;配置名称;默认：空
 *     @type string $slug 可选;配置名称;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type mixed $much_id 可选;类型ID(int|array);默认：空
 *     @type mixed $much_info 可选;分类描述(stirng|array);默认：空
 *     @type mixed $much_parent 可选;父级ID(int|array);默认：空
 *     @type mixed $much_count 可选;数量统计(int|array);默认：空
 *     @type mixed $meta_key 可选;扩展字段限制条件(string|array);默认：空
 *     @type mixed $meta_value 可选;扩展字段值限制条件(string|array);默认：空
 *     @type array $meta_key_value 可选;扩展字段一一对应限制条件(二维数组);默认：空
 *     @type string $field 可选;查询字段;默认：*
 *     @type int $limit 可选;分页大小;默认：0
 *     @type int $page 可选;当前分页;默认：0
 *     @type string $sort 可选;排序字段名(term_id|term_order|term_much_id|trem_much_count|term_meta_key|term_meta_value|term_meta_value_num);默认：op_order
 *     @type string $order 可选;排序方式(asc|desc);默认：asc
 *     @type array $where 可选;自定义高级查询条件;默认：空
 *     @type array $paginate 可选;自定义高级分页参数;默认：空
 * }
 * @return mixed $mixed obj|null 查询结果
 */
function DcCategorySelectGroup($args=[]){
    $defaults = array();
    if(!$args['paginate']){
        $defaults['paginate'] = DcPageFilter($args);
    }
    if(!$args['where']){
        $defaults['where'] = DcWhereFilter($args, ['id','name','slug','module','status','much_id','much_info','much_parent','much_count','meta_key','meta_value','meta_key_value'], 'eq', 'term_');
    }
    //多条件筛选字段处理
    if($defaults['where']['term_meta_key_value']){
        $metaKeys = array_keys($defaults['where']['term_meta_key_value']);
        $metaValues = array_values($defaults['where']['term_meta_key_value']);
        unset($defaults['where']['term_meta_key_value']);
        if( $metaKeys && $metaValues ){
            unset($defaults['where']['term_meta_key']);
            unset($defaults['where']['term_meta_value']);
            array_push($defaults['where'], function($query) use($metaKeys,$metaValues){
                $query->where('term_meta_key', 'in', implode(',',$metaKeys))->where('term_meta_value', 'in', implode(',',$metaValues));
            });
        }
    }
    //排序处理
    if($args['sort'] == 'term_meta_value_num'){
        $args['sort'] = '';
        $args['orderRaw'] = 'term_meta_value+0 '.$args['order'];
    }
    //基础定义
    $defaults['where']['term_much_type'] = ['eq','category'];
    $defaults['group'] = 'term.term_id';
    $defaults['with']  = 'term_meta';
    $defaults['view']  = [
        ['term', '*'],
        ['term_much', '*', 'term_much.term_id=term.term_id'],
        ['term_meta', '*', 'term_meta.term_id=term.term_id'],
    ];
    return \daicuo\Term::all( DcArrayArgs($args, $defaults) );
}
/**
 * 将分类列表转为checkbox样式
 * @version 1.6.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：false
 *     @type bool $tree 可选;是否转化为树型;默认：true
 *     @type bool $level 可选;是否将树型还原为层级结构;默认：true
 *     @type string $status 可选;显示状态（normal|hidden）;默认：normal
 *     @type string $ids 可选;ID列表;默认：空
 *     @type string $name 可选;配置名称;默认：空
 *     @type string $slug 可选;配置名称;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $searchText 可选;搜索关键字、搜索标题与别名;默认：空
 *     @type int $limit 可选;分页大小;默认：0
 *     @type int $page 可选;当前分页;默认：0
 *     @type string $sort 可选;排序字段名(term_id|term_slug|term_order);默认：term_order
 *     @type string $order 可选;排序方式(asc|desc);默认：asc
 * }
 * @return mixed $mixed obj|null 
 */
function DcCategoryCheck($args=[]){
    $args = DcArrayArgs($args,[
        'type'       => 'category',
        'fieldKey'   => 'term_much_id',
        'fieldValue' => 'term_name',
    ]);
    return \daicuo\Term::Option($args);
}
/**
 * 获取分类列表简单数组格式
 * @version 1.6.0 优化调用参数
 * @version 1.5.20 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：false
 *     @type bool $tree 可选;是否转化为树型;默认：true
 *     @type bool $level 可选;是否将树型还原为层级结构;默认：true
 *     @type string $status 可选;显示状态（normal|hidden）;默认：normal
 *     @type string $ids 可选;ID列表;默认：空
 *     @type string $name 可选;配置名称;默认：空
 *     @type string $slug 可选;配置名称;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $searchText 可选;搜索关键字、搜索标题与别名;默认：空
 *     @type int $limit 可选;分页大小;默认：0
 *     @type int $page 可选;当前分页;默认：0
 *     @type string $sort 可选;排序字段名(term_id|term_slug|term_order);默认：term_order
 *     @type string $order 可选;排序方式(asc|desc);默认：asc
 * }
 * @return mixed $mixed null|array
 */
function DcCategoryOption($args=[]){
    $args = DcArrayArgs($args,[
        'type'       => 'category',
        'isSelect'   => true,
        'fieldKey'   => 'term_much_id',
        'fieldValue' => 'term_name',
    ]);
    return \daicuo\Term::Option($args);
}

/**************************************************兼容旧版本函数***************************************************/
function DcLoadConfig($file, $name = '', $range = ''){
    return DcConfigLoad($file, $name, $range);
}
function DcWhereByQuery($fields=[], $condition='eq', $requestParams=[]){
    return DcWhereQuery($fields, $condition, $requestParams);
}